import torch
from torch.utils.data import Dataset

#自定义数据集类
class MyDataset(Dataset):
    def __init__(self,X_data,Y_data):
        #X_data和Y_data是两个列表或者数组
        #X_data:输入特征
        #Y_data：目标标签
        self.Y_data=Y_data
        self.X_data=X_data
    def __len__(self):
        #返回数据集大小
        return len(self.X_data)
    def __getitem__(self,idx):
        #返回指定索引的数据
        x=torch.tensor(self.X_data[idx],dtype=torch.float32)
        y=torch.tensor(self.Y_data[idx],dtype=torch.float32)
        return x,y

X_data=[[1,2],[3,4],[5,6],[7,8]]
Y_data=[1,0,1,0]
dataset=MyDataset(X_data,Y_data)

from torch.utils.data import DataLoader
#创建Dataloader实例，batch_size设置每次加载的样本数量
dataloader=DataLoader(dataset,batch_size=2,shuffle=True)
#打印加载的数据
for epoch in range(1):
    for batch_idx, (inputs,labels) in enumerate(dataloader):
        print(f'Batch {batch_idx+1}:')
        print(f"Inputs:{inputs}")
        print(f'Labels:{labels}')
"""
batch_size:每次加载的样本数量
shuffle：是否对数据进行洗牌，通常训练时需要将数据打乱
drop_last:如果数据集中的样本数不能被batch_size整除，设置为True时，丢弃最后一个不完整的batch
"""
import torchvision.transforms as transforms
from PIL import Image
#定义数据预处理的流水线
transform =transforms.Compose(
    [
        transforms.Resize((128,128)),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])#标准化

    ]
)

#加载图像
image=Image.open('image.jpg')
image_tensor=transform(image)
print(image_tensor.shape)#输出张量的形状

"""
trainsforms.Compose():将多个变换操作组合在一起
trainsforms.Tesize():调整图像大小
trainsforms.ToTensor():将图像转换为PyTorch张量，值会被归一化到[0,1]范围
trainsforms.Normalize():标准化图像数据，通常使用与驯良模型时需要进行标准化处理。
"""

transform=transforms.Compose(
    [
        transforms.RandomHorizontalFlip(),#随机水平翻转
        transforms.RandomRotation(30),#随机旋转30度
        transforms.RandomResizedCrop(128),#随机裁剪并调整为 128x128
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])
    ]
)

import torchvision.datasets as datasets
import torchvision.transforms as transforms

#定义预处理操作
transform =transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,),(0.5,))#对灰度图像进行标准化
])

#下载并加载MNIST数据集
train_dataset=datasets.MNIST(root='./data',train=True,download=True,transform=transform)
test_dataset=datasets.MNIST(root='./data',train=False,download=True,transform=transform)

#创建DataLoader
train_loader=DataLoader(train_dataset,batch_size=64,shuffle=True)
test_loader=DataLoader(test_dataset,batch_size=64,shuffle=True)

#迭代训练数据
for inputs,labels in train_loader:
    print(inputs.shape)
    print(labels.shape)

#用多个数据源
from torch.utils.data import ConcatDataset
#假设dataset1和dataset2是两个Dataset对象
conbined_dataset=ConcatDataset([dataset1,dataset2])
conbined_dataset=DataLoader(combined_dataset,batch_size=64,shufffle=True)


